我們今天就先從建立CNN模型開始進行手寫數字辨識。
from keras.utils import np_utils
import numpy as np
from keras.datasets import mnist
from keras.layers import Dense,Dropout,Flatten,Conv2D,MaxPooling2D
import matplotlib.pyplot as plt
from keras.models import Sequential
np.random.seed(10)
(x_train , y_train),(x_test,y_test)=mnist.load_data()
x_train4=x_train.reshape(x_train.shape[0],28,28,1).astype('float32')
x_test4=x_test.reshape(x_test.shape[0],28,28,1).astype('float32')
x_train4_nor = x_train4 /255
x_test_nor=x_test4 / 255
y_train_one=np_utils.to_categorical(y_train)
y_test_one=np_utils.to_categorical(y_test)
第1~7行:宣告要使用到的函式庫。
第9行:讀入Mnist資料。
第11~12行:將28*28的圖片矩陣轉為784個數字。
第14~15行:將資料正規化。
第17~18行:使用one-hot來進行轉換。
model = Sequential()
model.add(Conv2D(filters=16,
kernel_size=(5,5),
padding='same',
input_shape=(28,28,1),
activation='relu'
))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(filters=36,
kernel_size=(5,5),
padding='same',
activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128,activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(10,activation='softmax'))
第1行:建立一個線性堆疊的模型。
第3~8行:建立卷積層1。
=>filters:濾鏡的層數
=>kernel_size(a,b):濾鏡的大小為axb
=>padding='same':使影像經過卷積計算後大小不變
=>input_shape(a,b,c):a,b為輸入影像的大小,c為單色或彩色
=>activation:設定激勵函數
第9行:建立池化層1。
第10~13行:建立卷積層2。
=>filters:濾鏡的層數
=>kernel_size(a,b):濾鏡的大小為axb
=>padding='same':使影像經過卷積計算後大小不變
=>input_shape(a,b,c):a,b為輸入影像的大小,c為單色或彩色
第14行:建立池化層2
第15行:避免overfitting
第16行:建立平坦層
第17~18行:建立隱藏層,且避免overfitting
第19行:建立輸出層
到了這邊,我們就完成了keras的CNN模型的組建了,下一章開始進行訓練。